import { isDef, isUndef } from "../util/index.js";

export function createPatchFunction({ nodeOps }) {
  function invokeDestroyHook(vnode) {
    let i, j;
    const data = vnode.data;
    if (isDef(data)) {
      if (isDef((i = data.hook)) && isDef((i = i.destroy))) {
        i(vnode);
      }
    }
    if (isDef((i = vnode.children))) {
      for (j = 0; j < vnode.children.length; ++j) {
        invokeDestroyHook(vnode.children[j]);
      }
    }
  }

  function createElm(vnode, insertedVnodeQueue) {
    const { data, children, tag } = vnode;
    if (isDef(tag)) {
      // TODO ns是啥意思
      vnode.elm = vnode.ns
        ? nodeOps.createElementNS(vnode.ns, tag)
        : nodeOps.createElement(tag, vnode);
      // setScope(vnode);
    }
  }
  
  return function patch(oldVnode, vnode, hydrating, removeOnly) {
    // 没有后续的vnode
    if (isUndef(vnode)) {
      // 有旧的vnode
      if (isDef(oldVnode)) {
        // 移除vnode
        invokeDestroyHook(vnode);
      }
      return;
    }

    const insertedVnodeQueue = [];

    if (isUndef(oldVnode)) {
      createElm(vnode, insertedVnodeQueue);
    }
  };
}
